package com.t.bricks.bussiness.controller.filecabinet;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.t.bricks.bussiness.model.filestorage.FileInfo;
import com.t.bricks.bussiness.service.filestorage.FileStorageService;
import com.t.bricks.model.MsgEmity;

@RestController
@Api(value="文件存储", tags={"基本业务-文件存储操作接口"})
@RequestMapping("/file/storage/")
public class FileStorageController {

	@Autowired
	private FileStorageService fileStorageService;

	/**
	 * 文件上传
	 * @param file 文件
	 * @param sPath 存储路径(不含文件名的相对路径)
	 * @param sFileName 存储的文件名
	 * @param iCover 是否覆盖(1:是;2:否)
	 * @return
	 */
	//[start]
	@ApiOperation(value="文件上传", notes="将文件上传到指定相对目录下")
	@ApiImplicitParams({
		@ApiImplicitParam(name="file", value="文件", dataType="__file", paramType="form", required=true),
		@ApiImplicitParam(name="sPath", value="存储路径(不含文件名的相对路径)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sFileName", value="存储的文件名", dataType="String", paramType="query", required=false),
		@ApiImplicitParam(name="iCover", value="是否覆盖(1:是;2:否)", dataType="String", paramType="query", required=false)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|保存相对地址}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="请求存储的路径为空"),
		@ApiResponse(code=8002, message="出于安全考虑,请求存储的路径不能是绝对路径"),
		@ApiResponse(code=8003, message="指定的文件名不合法"),
		@ApiResponse(code=8004, message="存在同名文件,放弃保存"),
		@ApiResponse(code=8005, message="文件保存发生异常"),
		@ApiResponse(code=8006, message="文件保存失败")
	})
	//[end]
	@RequestMapping(method=RequestMethod.POST, value="/up")
	public MsgEmity upFile(@RequestParam("file") MultipartFile file,
			String sPath, String sFileName, Integer iCover) {
		return fileStorageService.upFile(file, sPath, sFileName, iCover);
	}

	/**
	 * 判断文件是否存在
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @return
	 */
	//[start]
	@ApiOperation(value="判断文件是否存在", notes="判断相对路径下的文件是否存在")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|文件记录编号}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="未找到文件"),
		@ApiResponse(code=8999, message="文件存在")
	})
	//[end]
	@RequestMapping(method=RequestMethod.POST, value="/check")
	public MsgEmity checkFile(String sPath) {
		return fileStorageService.checkFile(sPath);
	}

	/**
	 * 读取文件内容
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @return
	 */
	//[start]
	@ApiOperation(value="读取文件内容", notes="读取相对路径下的文件内容")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|文件内容}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="未找到文件"),
		@ApiResponse(code=8002, message="读取文件失败")
	})
	//[end]
	@RequestMapping(method=RequestMethod.POST, value="/read")
	public MsgEmity readFile(String sPath) {
		return fileStorageService.readFile(sPath);
	}

	/**
	 * 删除文件
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @return
	 */
	//[start]
	@ApiOperation(value="删除文件", notes="删除相对路径下的文件")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="删除失败,请检查文件是否在占用中")
	})
	//[end]
	@RequestMapping(method=RequestMethod.POST, value="/del")
	public MsgEmity delFile(String sPath) {
		return fileStorageService.delFile(sPath);
	}

	/**
	 * 下载文件
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @param request
	 * @param response
	 */
	//[start]
	@ApiOperation(value="下载文件", notes="下载相对路径下的文件内容")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|文件}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="未找到文件")
	})
	//[end]
	@RequestMapping(method=RequestMethod.GET, value="/down")
	public void download(String sPath,
			HttpServletRequest request, HttpServletResponse response) {
		fileStorageService.download(request, response, sPath);
	}

	/**
	 * 获取文件(消费者使用)
	 * @param sPath 存储路径(含文件名的相对路径)
	 * @return MsgEmity 返回结构中data为创建的经过压缩的Excel内容,接收端需要进行解压,msg为文件名
	 */
	//[start]
	@ApiOperation(value="获取文件", notes="下载相对路径下的文件内容")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|文件}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="未找到文件")
	})
	//[end]
	@RequestMapping(method=RequestMethod.POST, value="/down/zip")
	public MsgEmity downloadZip(String sPath) {
		return fileStorageService.downloadZip(sPath);
	}

	/**
	 * 读取文件目录
	 * @param findByTree 读取文件目录
	 * @return MsgEmity 返回查询结果
	 */
	//[start]
	@ApiOperation(value="读取文件目录", notes="读取相对路径下的文件目录", response=FileInfo.class)
	@ApiImplicitParams({
		@ApiImplicitParam(name="sPath", value="存储路径(不含文件名的相对路径)", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=7001, message="查询数量失败且发生异常"),
		@ApiResponse(code=7002, message="查询数据发生异常，值为null"),
		@ApiResponse(code=7003, message="查询分页数据发生异常"),
		@ApiResponse(code=7004, message="7004~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/find/tree")
	public MsgEmity findByTree(String sPath) {
		return fileStorageService.findByTree(sPath);
	}

}
